【发布时间】:2017-10-14 10:22:35
【问题描述】:
承诺是一个
(...) 可能现在可用、将来可用或永远不可用的值(来源:MDN)
假设我有一个想要处理图片的应用程序。图片已加载,例如在算法在后台使用它(或某种其他类型的延迟)之后。现在我想通过使用承诺而不是回调来检查图片是否在未来中可用。
要检查图像是否可用,我可以使用以下代码:
function loadImage(url) {
return new Promise((resolve, reject) => {
let image = new Image()
image.onload = function() {
resolve(image)
}
image.onerror = function() {
let message =
'Could not load image at ' + url
reject(new Error(msg))
}
image.src = url
})
}
属于 this 的承诺看起来像这样:
Promise.all([
loadImage('images/pic1.jpg'),
loadImage('images/pic2.jpg')
]).then((images) => {
images.forEach(img => addImg(img.src))
}).catch((error) => {
// handle error
})
这对我一点帮助都没有,因为如果图片在现在可用,而不是在未来可用,则承诺会查找。图片将在一秒钟内出现,但承诺仍然会返回错误。
我在这里没有得到关于承诺的什么?对我来说,检查的整个未来方面,如果图片可用取决于loadImage(url),而不是实际的承诺本身。
PS:受 funfunfunction 启发的示例
promise 如何知道它何时被解决?
据我了解,它不会“监听”周围的其他代码,更不用说可能在后台运行的框架了。我假设在这个例子中它会变成这样:promise 检查图片是否可用 -> 它们仍然在后台使用 -> promise 解决并抛出错误 -> 算法已完成图片 -> 图片可用?
【问题讨论】:
-
“promise 仍然会返回错误。”
javascript的问题在哪里出错? -
请注意这是假设性的!我知道还有其他方法可以解决这个问题。我想了解 Promise 在这里如何帮助我,以及为什么一切似乎都取决于 loadImage(url),而不是 Promise 本身
-
因为如果图片现在可用,promise 会查找,而不是将来。 - 关于未来的事情是它有一个习惯,最终变成现在。
-
You're Missing the Point of Promises。
Promise仅有助于执行任务。使用Promise并不能免除开发人员在代码中编写和维护正确的逻辑和错误处理的责任。 -
Promise 将返回错误并转到
// handle error,因为图像现在不可用。它们将在未来推出。
标签: javascript asynchronous promise es6-promise