我只是试图了解JavaScript Promises并且对某些事情感到困惑。
以下两个功能有什么区别?
function func_1()
{
var myArgs = Array.prototype.slice.call(arguments),
arg_1 = (myArgs[1]) ? myArgs[1] : 1,
arg_2 = (myArgs[2]) ? myArgs[2] : 2
;
return new Promise(function(resolve, reject) {
var result = arg_1 + arg_2;
resolve(result);
});
}
function func_2()
{
return new Promise(function(resolve, reject)
{
var myArgs = Array.prototype.slice.call(arguments),
arg_1 = (myArgs[1]) ? myArgs[1] : 1,
arg_2 = (myArgs[2]) ? myArgs[2] : 2
;
var result = arg_1 + arg_2;
resolve(result);
});
}
答案 0 :(得分:0)
您的第一个功能将按预期工作,因为它会访问func_1()
来电的arguments
object。
您的第二个函数访问您传递给arguments
构造函数的匿名回调函数的Promise
。在这里,myArgs == [resolve, reject]
。
请注意,对于您的任务,您根本不应将Promise
构造函数与其回调一起使用,而是Promise.resolve
function:
function func(_, arg1, arg2) {
return Promise.resolve((arg1 || 1) + (arg2 || 2));
}
答案 1 :(得分:0)
在您的示例中,这两个函数将导致基本相同的行为,但在func_2中,您的参数将引用Promise回调的参数而不是func_2闭包的args,这肯定会导致错误在你的代码中。然而,这个例子并没有真正以它们的设计方式利用Promise。
了解promise如何工作的最佳方法是使用它来处理异步行为。因此,如果您将示例更改为以下内容:
function func_1()
{
return new Promise(function(resolve, reject) {
$.get('stuff.json')
.success(function (result) {
resolve(result);
}).fail(function () {
reject();
});
});
}
在此示例中,promise使用jQuerys get方法启动异步请求。当请求成功或失败时,它会调用resolve或reject。因此,您在代码中使用func_1的方式如下:
func_1().done(function (result) {
// do something with the result
});
仅供参考,这个例子有点人为,因为$ .get已经返回了一个你可以做同样事情的承诺。