理解Javascript回调参数

时间:2015-08-02 06:14:52

标签: javascript callback

关于回调的几个问题,使用一些示例代码..

function uploadPhoto(params){

    var win = function(response){
       console.log("Success!");
       console.log("Response: ", response); 
    }

    var fail = function(error){
      console.log("Failed.");
      console.log("Error: ", error);
    }

    var options = {params: params};
    var ft = new FileTransfer();
    ft.upload(params.img_uri, "localhost:3000/testing"), win, fail, options);
}

在上面的示例中,使用FileTransfer我们可以将图像上传到服务器。如果成功,它将调用win函数,如果不成功,则调用fail函数。

获胜和失败功能如何接收 responseerror参数?我们没有打电话给win(response)fail(error),那么javascript如何接受这些参数而我们没有在ft.upload()行上设置这些参数?

更多示例代码:

function win(response){
  console.log("Success!");
  console.log(response);
};

function fail(error){
  console.log("Failed.");
  console.log("Error: ", error);
};

function uploadPhoto(params){
  var options = {params: params};
  var ft = new FileTransfer();
  ft.upload(params.img_uri, "localhost:3000/testing"), win, fail, options);
};

在第二个例子中,我发现可以调用win函数,但是它的响应'参数未定义。这是什么原因?

如果我希望我的win功能也接受上传功能中的params该怎么办,那么看起来会更像这样:

var win = function(response, parameters){
  console.log("Success with parameters: ", parameters);
  console.log("Response: ", response);
}

我的ft.upload行需要看起来更像这样:

ft.upload(params.img_uri, "localhost:3000/testing", win(null, params), fail, options);

这里有很多小问题,谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

  

获胜和失败功能如何接收 responseerror参数?我们没有打电话给win(response)fail(error),那么javascript如何接受这些参数而我们没有在ft.upload()行上设置这些参数?

ft.upload调用winfail,并为其提供responseerror的值。也就是说,ft.upload可能看起来像这样:

function upload(arg1, arg2, successCallback, failureCallback, options) {
  try {
    var response = something(...);
    successCallback(response);
  } catch(ex) {
    failureCallback(ex);
  }
}

现在,当您致电ft.upload(params.img_uri, "localhost:3000/testing", win, fail, options)时,win作为upload参数传递给successCallbackfail传递给failureCallback,{ {1}}依次使用适当的参数调用其中一个。

  

如果我希望我的upload功能也接受上传功能中的win该怎么办,那么看起来会更像这样:

params
     

我的var win = function(response, parameters){ console.log("Success with parameters: ", parameters); console.log("Response: ", response); } 行需要看起来更像这样:

ft.upload

关闭,但不完全。如果你这样做,你将传递ft.upload(params.img_uri, "localhost:3000/testing"), win(null, params), fail, options); win作为参数返回的内容,除非它们返回fail试图调用它们时会出现问题的函数。

......这不是巧合,是一种解决方案:让它们返回ft.upload可以调用的函数:

ft.upload

另一种选择是使用function makeSuccessCallback(parameters) { return function successCallback(response) { console.log("Success with parameters: ", parameters); console.log("Response: ", response); } } var win = makeSuccessCallback(params); ft.upload(params.img_uri, "localhost:3000/testing", win, fail, options); 。您可能已经看到Function.prototype.bind用于设置函数的bind对象,但我们也可以将其他参数传递给this,并且返回的函数将使用这些参数作为其自己的初始参数。在计算机科学中,这被称为“currying”。例如:

bind

(由于此函数不关心function add(n, m) { return n + m; } var addThree = add.bind(null, 3); addThree(4); // => 7 var ten = add.bind(null, 4, 6); ten(); => 10 ,我们只传递this作为第一个参数。)

使用回调函数,我们可以使用它来获取函数的“副本”,但第一个参数是“内置”的:

null

这样,当function successCallback(parameters, response) { console.log("Success with parameters: ", parameters); console.log("Response: ", response); } var win = successCallback.bind(null, params); ft.upload(params.img_uri, "localhost:3000/testing", win, fail, options); 调用ft.upload时,它实际上会调用win(response)

答案 1 :(得分:1)

  

获胜和失败函数如何收到响应或错误   参数Δ

它没有自动收到此消息,而是通过以下方式编写代码的人从win函数调用failupload

if (success) {
    win(response)
} else if(failure) {
    fail(error)
}

如果在upload中,您没有调用此功能,则这些功能不会被调用。 JavaScript按照你的意思去做。

  

在第二个例子中,我发现可以调用win函数,但是它的响应'参数未定义。这是什么原因?

在第一个例子中也可以调用

win函数。如果你这样打电话给胜利:win(),那么你会得到undefined回复;但是,如果您发送了一些数据,例如:win({foo: "foo"}),那么您将不会得到任何未定义的数据,而是您将获得您已通过的数据。

  

如果我想让我的win函数同时接受上传函数中的参数

,该怎么办?

您已将params传递给upload,然后使用以下方式致电win

win(response, params);

win定义如下:

function win(response, params) {...}

var win = function(response, params) {...}
  

我的ft.upload行是否需要看起来更像这样:   ft.upload(params.img_uri, "localhost:3000/testing", win(null, params), fail, options);

是的,你可以这样做,但它会通过upload然后通过win返回的值。在您的情况下,这可能不是必需的。

答案 2 :(得分:1)

首先:ft.upload(params.img_uri, "localhost:3000/testing"), win, fail, options);处存在语法错误。删除"localhost:3000/testing"后的括号。

我对你使用的上传功能一无所知,所以我不知道你是否正确传递了其他参数。让我们假设一切都做得很好。

您的第一个问题是如何调用胜出函数。

在JavaScript中,您可以将函数传递给另一个函数。那就是你 在这里做您传递定义上传功能的功能。上传功能的责任是处理这些功能参数。

我认为它会创建一个http对象将数据作为八位字节流发送到服务器,当传输完成时,如果传输成功则调用其中一个函数,如果传输失败则调用失败。它取决于它的实现,当它调用win或fail时它将通过哪个参数。在您的情况下,它可能是http对象的响应或失败时的错误。

你的第二个问题是如何将你的参数传递给回调。

在第一种情况下,您可以在定义了params变量的上下文中定义函数(作为周围函数的参数)。 JavaScript中的函数是闭包或lambda函数,这意味着它们可以使用范围/上下文的变量来定义它们。因此,在第一个示例中,您不需要传递params变量。您可以直接在功能中使用它。在第二个示例中,函数无法访问params变量,因为回调是在其范围之外定义的。然后你必须创建部分函数(这里有很多要解释它,但是如果你感兴趣我会添加一个例子。只需删除注释;-))或将params对象绑定到回调。如果将其绑定到回调,则可以以this的形式访问回调内的params对象。还有一种特殊形式的部分函数,​​称为函数currying,可以在这里工作。