关于回调的几个问题,使用一些示例代码..
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
函数。
获胜和失败功能如何接收 response
或error
参数?我们没有打电话给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);
这里有很多小问题,谢谢你的帮助!
答案 0 :(得分:2)
获胜和失败功能如何接收
response
或error
参数?我们没有打电话给win(response)
或fail(error)
,那么javascript如何接受这些参数而我们没有在ft.upload()
行上设置这些参数?
ft.upload
调用win
或fail
,并为其提供response
或error
的值。也就是说,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
参数传递给successCallback
而fail
传递给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
函数调用fail
或upload
:
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,可以在这里工作。