AngularJS:如何压扁这个Promise链?

时间:2014-08-26 17:43:37

标签: javascript angularjs promise chaining angular-promise

我有以下代码:

someService.fnReturnsPromise()
    .then(function () {
        return someService.fnReturnsAnotherPromise(someArg);
    })
    .then(function (resultsOfSecondFn) {
        // do stuff with results
    });

我觉得这应该有效;但是,resultsOfSecondFn实际上并不是结果,而是我返回的承诺本身。为了让它按照我想要的方式工作,我必须这样做:

someService.fnReturnsPromise()
    .then(function () {
        return someService.fnReturnsAnotherPromise(someArg);
    })
    .then(function (promiseReturn) {
        promiseReturn.then(function (results) {
            // do stuff with results
        });
    });

这是fnReturnsAnotherPromise

的伪代码
someService.fnReturnsAnotherPromise = function (arg1) {
    return anotherService.anotherFnThatReturnsPromise(arg1);
};

实际上,它只是一个额外的层,但无论如何都会返回一个承诺。 anotherFnThatReturnsPromise的代码是$q.defer()return dfd.promise的简单范例,其中包含resolve()个。{/ p>

2 个答案:

答案 0 :(得分:6)

像Angular这样的承诺是Promises / A +兼容并保证以递归方式同化承诺。这正是为了避免嵌套并简化像你的情况这样的事情,这是承诺的重点。

因此,即使您有一个返回的承诺和一个返回承诺的承诺,您也可以在一次.then调用中解开它。例如:

var p  = $q.when(1); // Promise<Int>
var p2 = $q.when().then(function(){ return p;  }); // Promise<Promise<Int>>
var p3 = $q.when().then(function(){ return p2; }); // Promise<Promise<Promise<Int>>>>
p3.then(function(result) {
    console.log(result); // Logs 1, and Int and not p2's type
});

或者在你的例子中:

someService.fnReturnsPromise()
.then(function() {
    return someService.fnReturnsAnotherPromise(someArg);
})
.then(function(resultsOfSecondFn) {
    // do work with results, it is already unwrapped
});

有关承诺未展开的观点,请参阅this comparison with another language

答案 1 :(得分:-2)

你可以这样试试:

someService.fnReturnsPromise().then(function () {
    someService.fnReturnsAnotherPromise(someArg).then(function (results) {
        console.log(results);
    });
});

希望它有所帮助!