iT邦幫忙

0

nodejs , promise 串接 可否取的先前的參數

Zaku 2017-12-19 17:54:365974 瀏覽

假定用串接的方式循序執行:

function a(){
    retrun new Promise(function(resolve, reject){
        let parameterA = 'a';
        resolve(parameterA);
    });
}

function b(){
    retrun new Promise(function(resolve, reject){
        let parameterB = 'B';
        resolve(parameterB);
    });
}

function c(){
    retrun new Promise(function(resolve, reject){
        let parameterC = 'C';
        resolve(parameterC);
    });
}

a().then(function(){
    return b();
}).then(function(parameterB){
    //可取得 b() 的 return parameterB
    return c();
}).then(function(parameterC){
    //可取得 c() 的 return parameterC
    //這裡有辦法取的 parameterB?
}).catch(function(e){

})

如果是Promise.all等功能可以統一取得回傳,但如果是串接的方式,有辦法取的前幾次promise的參數嗎,在不要用全域參數去取的情況下。

看更多先前的討論...收起先前的討論...
10程式中 iT邦研究生 4 級 ‧ 2017-12-19 20:06:54 檢舉
你可以試試看 async 的 waterfall
https://caolan.github.io/async/docs.html
Zaku iT邦新手 3 級 ‧ 2017-12-20 09:34:25 檢舉
我之前也是用這個,但後來都換成promise = =~他可以做,但變成要混著做,想說看他本身是不是有寫法可以拿
fillano iT邦超人 1 級 ‧ 2017-12-20 10:27:15 檢舉
function c加參數傳parameterB,然後resolve的時候同時傳parameterB跟parameterC不就可以了?
Zaku iT邦新手 3 級 ‧ 2017-12-20 11:25:49 檢舉
可以,但如果是從function A 傳到 function N,那這樣就要傳遞N次,變得很混亂,parameter A只在N會用的到,那他被傳遞了N次才用到
fillano iT邦超人 1 級 ‧ 2017-12-20 13:15:52 檢舉
那就沒辦法了,這問題其實跟Promise也沒關係XD。你不想用global變數的話,那用匿名函數包起來吧。
Zaku iT邦新手 3 級 ‧ 2017-12-21 10:04:03 檢舉
恩看看各位有何寫法= =
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
谷哥
iT邦新手 3 級 ‧ 2017-12-21 15:21:49

傳 object 如何?

function a(){
    return new Promise((resolve, reject) => {
        const ball = {};
        ball.parameterA = 1;
        resolve(ball);
    });
}

function b(ball){
    return new Promise(function(resolve, reject){
        ball.parameterB = 'B';
        resolve(ball);
    });
}

function c(ball){
    return new Promise(function(resolve, reject){
        ball.parameterC = 'C';
        resolve(ball);
    });
}

a().then(function(ball){
    return b(ball);
}).then(function(ball){
    console.log(ball.parameterB); //可取得 b() 的 return parameterB
    return c(ball);
}).then(function(ball){
    console.log(ball.parameterC); //可取得c() 的 parameterC
    console.log(ball.parameterB); //也可取得 b() 的 return parameterB
}).catch(function(e){
    console.log(e);
})
Zaku iT邦新手 3 級 ‧ 2017-12-26 15:29:36 檢舉

好像好很多喔,但也還是全域的XD

谷哥 iT邦新手 3 級 ‧ 2017-12-26 17:33:57 檢舉

咦?不是全域的啊,ball 宣告在第一個 promise 裡。

Zaku iT邦新手 3 級 ‧ 2017-12-27 12:17:14 檢舉

喔喔喔抱歉,沒仔細看好,都塞在同一個物件裡丟就是了

我要發表回答

立即登入回答