在JavaScript Promise Declaration中定义变量而不是在外部

时间:2014-12-04 19:26:28

标签: javascript promise

我只是试图了解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);
    });
}

2 个答案:

答案 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已经返回了一个你可以做同样事情的承诺。