2017-07-04 38 views
-1

我有正在一個異步調用 並在sucess,它使另一個異步調用如何等待ASYC呼叫,直到鏈成功

前一個功能: -

function1 =() => { 
     /*Some required Logic*/ 
    return fetch("myurl") 
     .then((json) => { 
     function2(json) 

     }) 
     .catch((error) => { 
     console.log(error) 
     }) 
} 

function2 =() => { 
    /*Some required Logic*/ 
    return fetch("myurl2") 
     .then((json) => { 
     callthirdfunction(json) 

     }) 
     .catch((error) => { 
     console.log(error) 
     }) 
} 

現在這裏3 中,我很依賴功能1

function3 =() => { 
    /*Some required Logic*/ 
    function1().then(() => { 
}) 
} 

發行成功的功能是它只是等待,直到期函數的調用ASYC蘇是cceeded它不是等待函數2的異步調用成功

我知道我可以像ASYN調用鏈,但它不是可能的,因爲不可避免的情況

在這方面的任何寶貴意見或引線寫會有很大的幫助

+0

你希望函數3在函數1和函數2完成後觸發? –

+0

我的代碼流是這樣從function3,我正在進行function1調用和函數1調用是依賴於function2。所以,一旦function1和function2成功,我想要我的邏輯。 有意義嗎? – user3677291

+0

你的問題是,你不'''''''回調'從'then'回調中使用的承諾,所以承諾鏈不知道該等什麼。 – Bergi

回答

0

如果使用async await當你在你的代碼中提到,你可以只使用它這樣的:

await function1(); 
await function2(); 
await function3(); 

同時加入了async關鍵字的函數聲明:

function1 = async() => { 

} 

另一種選擇是promisify你的函數,然後打電話給他們這樣的:

function1() 
.then(function2) 
.then(function3) 
.catch() {} 
0

如果你想要一個承諾,依賴於另一個諾言,你需要returnthen的相關承諾。

您的代碼不什麼用的function2結果:

return fetch("myurl") 
    .then((json) => { 
    function2(json) 

    }) 

這應該讀

.then((json) => { 
    return function2(json) 
}) 

then整點是,它允許後續承諾通過鏈從回調中返回它們。

0

承諾只有當你返回它們才能獲得鏈接。在下面的示例中,

function resolveAfter2Seconds(x) { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     resolve(x); 
    }, 2000); 
    }); 
} 


async function add1(x) { 
    const a = await resolveAfter2Seconds(20); 
    const b = await resolveAfter2Seconds(30); 
    return x + a + b; 
} 

請注意resolveAfter2Seconds中的return關鍵字。確保當你調用一個觸發承諾的方法時,添加'返回'關鍵字