承诺:在不从fn返回的情况下提供状态更新

时间:2017-05-11 12:21:23

标签: javascript promise

我有一个调用三个异步函数的函数。 我想在每次完成其中一个功能时通知被叫方,以向用户显示操作的进度。

有没有办法在没有从fn返回的情况下“通知”被叫方?

function updateDataset(...) {
    return a().then(function () {
        console.log("[someService] Task 1 done...");

        return b(...).then(function (entries) {
            console.log("[someService] Task 2 done...");

            var requests = c(entries);

            return Promise.all(requests).then(function () {
                console.log("[someService] Task 3 done...");

                return true;
            });
        });
    });
}

被叫方看起来像这样:

someService.updateDataset(...).then(function (isSucc) {
    //Do stuff
});

如果我可以将.notified()链接到承诺链......

,那将是非常棒的

1 个答案:

答案 0 :(得分:2)

你可以传递一个回调并在那里处理通知,另外你可以“扁平化”链,这样每个承诺都会返回,而你在另一个.then内没有.then

我重构了一些你的代码只是为了向你展示一种可行的方法。

function updateDataset(notificationCb) {
    return a()
    .then(function () {
        console.log("[someService] Task 1 done...");
        notificationCb(1); //first ended
        return b(...);
    })
    .then(function (entries) {
        console.log("[someService] Task 2 done...");
        var requests = c(entries) ;
        notificationCb(2); //second ended
        return Promise.all(requests);
     })
    .then(function () {
       console.log("[someService] Task 3 done...");
       //here there's no need to call the callback because the fn returns to the caller
       return true;
    });
}

和来电者:

someService.updateDataset(function(notification){
 //here you choose the strategy to handle the notification
 if(notification === 1){ 
   //first has ended.. etc.
 } else{

 }
})
.then(function (isSucc) {
    //Do stuff
});