我正在嘗試使用承諾一個小的新項目。但是我在理解如何更好地組織我的代碼時遇到了一些問題,並帶有函數。問題是,我想要我的函數來處理事情,我的主要代碼處理其他事情。讓我們看看下面的代碼:承諾與功能鏈接
function doSomething (isGoingToResolve = true) {
return new Promise((resolve, reject) => {
if (isGoingToResolve) {
resolve("something")
} else {
reject("something else")
}
}).then(response => {
console.log("in my function",response)
}).catch(error => {
console.log("in my function",error)
})
}
doSomething().then(response => {
console.log("in my main call", response)
})
有了這個代碼,控制檯將記錄in my function something
和in my main call undefined
:https://jsfiddle.net/hkacvw2g/
於是我發現了兩個解決方案,以解決我的問題,但我只是不喜歡他們:
第一個是創建一個變量,該變量使用.then()
,然後返回變量(https://jsfiddle.net/hkacvw2g/1/):
function doSomething (isGoingToResolve = true) {
let promise = new Promise((resolve, reject) => {
if (isGoingToResolve) {
resolve("something")
} else {
reject("something else")
}
})
promise.then(response => {
console.log("in my function",response)
}).catch(error => {
console.log("in my function",error)
})
return promise
}
並將第二溶液(https://jsfiddle.net/hkacvw2g/2/):
function doSomething (isGoingToResolve = true) {
return new Promise((resolve, reject) => {
if (isGoingToResolve) {
resolve("something")
} else {
reject("something else")
}
}).then(response => {
console.log("in my function",response)
return new Promise(resolve => {
resolve(response)
})
}).catch(error => {
console.log("in my function",error)
return new Promise((resolve,reject) => {
reject(error)
})
})
}
我缺少一個更好的解決方案,以解決我的問題?
關閉話題。我建議你閱讀關於承諾反模式。經驗法則:您幾乎不需要在代碼中手動使用'Promise'構造函數。 http://www.datchley.name/promise-patterns-anti-patterns/ –
感謝您的評論和鏈接,我實際上使用'mysql-promise' npm軟件包,但我想讓我的問題更通用 – Hammerbot
您可能想看看這篇關於承諾鏈接的文章,這篇文章幫助我圍繞這個話題進行了包裝。 HTTP:// solutionoptimist。com/2013/12/27/javascript-promise-chains-2/ – Hinrich