這裏是我的情況:異步函數內部少輝
fetchData(foo).then(result => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + bar);
}, 0)
});
}).then(result => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + woo);
}, 0)
});
}).then(result => {
setTimeout(() => {
doSomething(result);
}, 0)
});
其中每個setTimeout的是使用回調格局不同的異步操作。
這實在是不好受來包裝一個承諾內的各功能,我覺得自己的代碼應該看起來更像是這樣的:
fetchData(foo).then(result => {
setTimeout(() => {
return result + bar;
}, 0)
}).then(result => {
setTimeout(() => {
return result + woo;
}, 0)
}).then(result => {
setTimeout(() => {
doSomething(result);
}, 0)
});
顯然,這是行不通的。
我是否使用Promises?我是否真的必須在承諾中包含所有現有的異步函數?
編輯:
其實我知道我的例子也並非完全reprensentative我的情況,我沒有說清楚,在我的例子中的setTimeout是爲了reprensent EN異步操作。這種情況更能代表我的情況:
fetchData(foo).then(result => {
return new Promise((resolve, reject) => {
asyncOperation(result, operationResult => {
resolve(operationResult);
}, 0)
});
}).then(result => {
return new Promise((resolve, reject) => {
otherAsyncOperation(result, otherAsyncResult => {
resolve(otherAsyncResult);
}, 0)
});
}).then(result => {
doSomething(result);
});
如果您不想使用諾言,您可以使用自定義事件。這個事件將被觸發每個檢測變化! (https://www.sitepoint.com/javascript-custom-events/)....但爲什麼你不喜歡使用諾言? –
有像''pify'](https://github.com/sindresorhus/pify)這樣的模塊可以幫助您提供現有的基於回調的異步函數。此外,合理數量的包爲其異步函數提供_both_承諾和回調支持(當您不傳遞迴調函數時,它們會返回一個承諾)。但我不能說這是否適用於你的情況。 – robertklep
^^是或'bluebird'非常簡單,其行爲與原生Promise類似,但對節點樣式回調更友好。 [鏈接](http://bluebirdjs.com/docs/api/promise.fromcallback.html) – user3821538