2016-09-27 81 views
0

你好的一部分來解決一個承諾,我只能選擇在if語句

我有一個設計這樣的模塊中的功能:

myFunction: function(some args, myBoolean) { 
    var deffered = q.defer() 
    if(myBool) { 
    module.exports.mySecondfunction(args, false, null) 
    } else { 
    return module.exports.mySecondfunction(args, true, deffered) 
}, 

mySecondFunction: function(some args, myBoolean, myPromise) { 
    //Some work here 
    if(myBoolean) { 
    //Some work 
    promise.resolve(); 
    return myPromise.promise 
    } 
} 

anotherFunction: function(some args) { 
    //some work 
    if (something) { 
    myFunction(some args, true) 
    } else { 
    myFunction(some args, false).then((data) => { 
     //do stuff 
    } 
    } 
} 

當anotherFunction被觸發並進入「其他人」 的一部分,我的服務器拋出一個錯誤:

TypeError: Cannot read property 'then' of undefined

行,其中失敗是:

myFunction(some args, false).then((data) => {...

你對我的代碼有什麼問題有什麼想法嗎?無論如何只有在布爾值設置爲True時才承諾函數?

+0

你應該幾乎不會傳遞延期。如果它想返回一個,使'mySecondFunction'構造它自己的承諾。 – Bergi

+0

是的,有時候回覆一個承諾,有時候不是一個非常糟糕的主意。只要返回一個已經履行的承諾,如果你在一個沒有任何異步的分支。 – Bergi

回答

0

您應該對兩個函數都返回一個承諾。可以使用類似:

anotherFunction: function(some args, myBoolean, myPromise) { 
    //some work 
    if (something) { 
    myFunction(some args, true) 
    } else { 
    myFunction(some args, false).then((data) => { 
     //do stuff 
    } 
    } 
    myPromise.resolve(); 
    return myPromise.promise; 
} 

承諾在這種情況下起到抽象異步/同步方式的變化,這將使它更容易爲你,如果你需要更改anotherFunction成爲一個真正的異步。

順便說一句:我不認爲你應該導出承諾,如果你導出一個函數,當被調用時返回一個承諾,如導出myFunction,你可以使你的代碼更加可重用。

0

你總是必須解決你的承諾。

我打算繼續前進,並建議使用async/await語法。目前,您需要babel

async function takesAwhile(otherFirst) { 
    if (otherFirst) await doOtherThing(); 
    return doStuff();  
} 
+0

我相信'return'語句中的'await'是多餘的。 – zerkms

+0

我只是在想,這個doStuff也是異步的。可能是。 –

+0

這不重要,如果它是異步或不。 'return await'與'return'無法區分。 PS:我真的很喜歡你的個人資料中的「關於」! :-D – zerkms