2014-02-09 98 views
3

我需要鏈接一些異步操作。我正在嘗試編寫使用快遞的Parse.com雲碼。 (我認爲明示是承諾支持起源的地方)。我明白爲什麼承諾是有價值的,但我仍然不確定一些事情。首先是如何收集順序操作的結果。下面的代碼說明:thing1完成Javascript承諾結果範圍

function doAsnychThingsInSequence(params) { 
    return doThing0(params).then(function(resultOfThing0) { 
    // thing1 depends on resultOfThing0 
    doThing1(resultOfThing0); 
    }).then(function(resultOfThing1) { 
    // here is where I am confused. 
    // thing2 depends on the results of thing0 and thing1 
    doThing2(resultOfThing0 /* out of scope?? */, resultOfThing1); 
    }, function(error) { 
    // handle error 
    }); 
} 

後,我需要兩個動作的結果。我想我可以在函數的頂部分配一個變量,並將其分配給第一個回調中的第一個結果,那是正確的方法嗎?我想,在我迷茫的心臟是問題二...

return doThing0(params0).then(function(resultOfThing0) { 
    doThing1(resultOfThing0); 
    // what does return mean here? does what I return here relate to the 
    // parameters of the next function? 
    return "foo"; 
    }).then(function(param) { 
    // what is in param? is it "foo"? 
    }, function(error) { 
}); 
+0

感謝。我以爲我是從JS那裏得到的。編輯。我通過解析雲代碼來使用快遞。 – someShmuck

回答

1

承諾可以被想象成一個流處理:一個函數獲取輸入,做一些事,並把它傳遞給下一個函數鏈。

因此,如果您需要進一步通過輸入(鏈)的參數,你應該包括他們到 輸出數據,以便下一個鏈條可以使用它們:

function doThing1(params1) { 
    ... 
    return [params1, result1]; 
} 

function doThing2(params1, params2) { 
    ... 
} 

正如你剛纔提到你可以使用doThing1和doThing2之外的一些變量,但它會使這些函數有狀態,可能導致各種副作用。一般不需要異步處理。

+0

感謝您的幫助。我想這個答案更正確,但遺憾的是,這對Promise來說是一種無奈。 – someShmuck

+0

@ user3245272是的,作爲一個概念的承諾還很不理想,想... –

+0

看起來承諾應該包括一個剛剛通過的「上下文」參數,但讓代碼掛起中間結果。是否有某種方法可以在當前塊中構造數組,並讓doThing1函數返回單個結果? – someShmuck

1

提供給then()的函數必須返回一個值,無論該值是要使用的值還是即將到來的值的承諾。無論哪種方式(根據承諾規範)then()將返回一個新的承諾。這是我用代碼看到的第一個問題。

接下來是您必須將thing1存儲在更高的範圍內,以便您稍後可以訪問它。因此,像這樣可能是爲了:

// example 
var thing1; 
getThing1() 
.then(function(value){ 
    thing1 = value; // <-- store in higher scope 
    return getThing2(); // <-- return 
}) 
.then(function(value){ 
    thing2 = value; 
    // now you have both thing1 and thing2 in scope 
}) 
+0

感謝您的幫助。並感謝回報價值。我總結了我在下面學到的東西。 – someShmuck

1

我想總結一下我從@greim和@ C-笑容兩個有用的答案教訓。 +1兩者的善意幫助。但是,如果我理解正確,那麼對我來說這是對Promises的失望。

@ greim的回答將使我的回調指向包含函數中的局部變量。但這是令人失望的,因爲它使回調依賴於當地人。例如,很難傳遞迴調。

@ c-smile的回答會讓我的函數返回一個數組(或某些集合)的參數及其結果。然後,該函數的所有調用者都會期望挖掘「自然」結果的返回值,而不是用於獲得結果的參數。

重申發佈在我原來的職位方面的答案:

// @greim 

function doAsnychThingsInSequence(params) { 
    var theResultOfThing0; // yuck, for needing to make up a non-colliding variable name 
    return doThing0(params).then(function(resultOfThing0) { 
    theResultOfThing0 = resultOfThing0; 
    return doThing1(resultOfThing0); 
    }).then(function(resultOfThing1) { 
    return doThing2(theResultOfThing0, resultOfThing1); 
    }, function(error) { 
    // handle error 
    }); 
} 

// @c-smile 

function doThing1(params) { // params are resultOfThing0 
    // do stuff 
    // the "natural" answer is just resultOfThing1, but ... 
    return [params, resultOfThing1]; 
} 

// if this function was doThingN, then we'd have 
    return [params0, params1 ... paramsN, resultOfThingN]; // yikes! 

// at least this method looks great now, how I want it to look... 
function doAsnychThingsInSequence(params) { 
    return doThing0(params).then(function(resultOfThing0) { 
    return doThing1(resultOfThing0); 
    }).then(function(resultOfThing0, resultOfThing1) { 
    return doThing2(resultOfThing0, resultOfThing1); 
    }, function(error) { 
    // handle error 
    }); 
}