我努力實現Promises。 (我認爲我明白他們,但我經常得到意想不到的結果,所以也許我不知道。)關於承諾的細節;示例
請考慮這段代碼。
function ap() {
return new Promise(function(resolve, reject) {
console.log('function ap starting want this');
function ender() {
console.log('function ender starting want this');
return resolve('ender');
console.log('after return in ender don\'t want this'); //#1
}
ender()
console.log('after function ender and its resolve ' +
'for Promise don\'t want this'); //#2
}) // Promise
} // ap
console.log('---')
ap()
.then(function(result, error) {
if (error) console.log ('error ' + error.message)
console.log('function ap result result=' + result +
' want this')
})
我已經包含的console.log語句很多地方,並表示我是否希望他們打印,給我的承諾的理解。
我預計:
function ap starting want this
function ender starting want this
function ap result result=ender want this
我不想最後一次通話裏面安德CONSOLE.LOG(//#1),因爲它是經過充分迴歸到讓我離開安德範圍。我的棉絨聲稱它「無法達到」;聽起來一致。
我並不想在ender調用之後調用控制檯(//#2),因爲ender畢竟解決了幾乎所有ap範圍的Promise;退出承諾並退出ap並不奇怪。
我:
function ap starting want this
function ender starting want this
after function ender and its resolve for Promise don't want this
function ap result result=ender want this
問:這是正確的教訓是什麼?該語言不承認在適用範圍內承諾的重要性。 「回報」足以讓範圍擴大,但不是範圍。 「解決('恩德')」足以解決承諾。 ender調用之後繼續執行鏈,這就是打印不需要的語句的原因。程序員必須都發送回調函數的Promise 和超出封閉函數的範圍。
繼續假設是真的,我寫了這段代碼。
function bp() {
return new Promise(function(resolve, reject) {
console.log('function bp starting want this')
function ender() {
console.log('function ender starting want this');
return resolve('ender');
console.log('after return in ender don\'t want this');
}
ender(); return;
console.log('after function ender and its resolve ' +
'for Promise don\'t want this');
}) // Promise
} // bp
它與第一個代碼的不同之處僅在於我在ender調用之後立即添加了一個返回值。通過ender的唯一途徑包括「return resolve('ender')」;如果我在ender調用後立即添加「return」,它會讓我脫離bp範圍,並且一切都可能會好起來。
考慮到不同的函數名稱,我期望得到與我以前預期的相同的結果並獲得了該結果。似乎我的「經驗教訓」可能接近正確的答案。
接下來我寫了這段代碼(請忽略對j的引用;它們讓人分心;我認爲我需要它們來解決後續問題,但這並不是第一次工作,所以使這篇文章變短了):
function cp(i, j) {
return new Promise(function(resolve, reject) {
console.log('function cp starting i=' + i +
' j=' + j + ' want this');
function ender() {
console.log('function cp ender starting i=' + i +
' j=' + j + ' want this');
i++;
let reps = 3;
if (i < reps) {
cp(i, j)
.then(function(result, error) {
if (error) {
console.log('*** error i=' + i +
' j=' + j + ' msg=' + error.message +
' want this');
return reject(error);
}
console.log('in cp cp('+ i + ', ' + j +
') result=' + result + ' want this');
return resolve(result);
}) // cp(i) callback
console.log('in cp i=' + i + ' j=' + j + '' +
' in ender after reject, resolve, and ' +
'callback don\'t want this'); //#3
} // if (i < reps)
console.log('in cp resolving i=' + i +
' j=' + j + ' want this')
return resolve('done');
} // ender
ender(); return;
console.log('in cp i=' + i + ' j=' + j +
' after ender call and return for cp scope' +
' don\'t want this');
}) // Promise
} // cp
它增加了遞歸,並立即跟着ender調用「return」;它刪除了linter標識的無法訪問的代碼;一切都可能順利。
我
function cp starting i=0 j=0 want this
function cp ender starting i=0 j=0 want this
function cp starting i=1 j=0 want this
function cp ender starting i=1 j=0 want this
function cp starting i=2 j=0 want this
function cp ender starting i=2 j=0 want this
in cp resolving i=3 j=0 want this
in cp i=2 j=0 in ender after return, resolve, and callback don't want this
in cp resolving i=2 j=0 want this
in cp i=1 j=0 in ender after return, resolve, and callback don't want this
in cp resolving i=1 j=0 want this
in cp cp(2, 0) result=done want this
in cp cp(1, 0) result=done want this
function cp result result=done want this
這就是我希望得到的,除了//#3版畫因爲語言不承認所有的可能性被要麼「拒絕」或覆蓋「解決」內回調塊;它繼續在那個位置不明智地執行命令。
這些代碼位是我繼續遇到麻煩的程序的模型。很快,我希望能夠模擬出令我驚訝的其他行爲。
在更一般的層面上:Promises的第一次使用者經常無法理解Promise?我們如何能夠有更高的信心來適當控制執行流程?在這個詳細程度上解釋什麼資源特別有用?我會感謝在這個更一般的層面上的任何建議。
在此先感謝...
OMG,serioursly ???嘗試發佈相關細節並不是完整的故事。 – dreamweiver
爲什麼你甚至使用'j'? – thefourtheye
像***這樣的問題Promises的第一次使用者經常無法理解Promise?***對Stack Overflow來說過於寬泛。人們可以寫一本關於該主題的書或很長的文章。這個網站的效果最好,一個簡潔的問題在幾個主要不以意見爲基礎的段落中有明確的答案。另外,對於堆棧溢出,要求第三方資源被視爲** off-topic **。這個問題需要清理或關閉。 – jfriend00