【发布时间】:2017-08-02 19:07:07
【问题描述】:
我知道我们可以使用.then 来确定异步调用的顺序:
return doTask1()
.then(function () {
return doTask2()
})
但有时有灯会很方便,并且可以说:等到灯设置为绿色后才执行task2; light 是一个初始设置为 RED 的变量,可以通过 task1 或其他函数设置为 GREEN。
有谁知道是否可以做到这一点?
编辑1:我认为当我们需要结束几个任务来设置浅绿色,并且我们不知道/介意顺序时,能够表达这一点特别有用这些任务。 .then 不能轻易做到这一点,因为我们不知道这些任务的顺序。
编辑 2: 关于my light,我曾问过a more specific question。总之,我们正在等待的是另一个应用程序 B 通过postMessage 发送的消息。目前,我已经编写了以下代码(在resolve 中),它或多或少都可以工作(我还没有尝试过只用它们的公共部分制作一个函数是否可以工作)。
task1: ['codeService', '$window', '$q', function (codeService, $window, $q) {
return codeService.task1().then(function () { // task1 sends a request to another application B by postMessage
var deferred = $q.defer();
$window.addEventListener("message", function (event) {
if (event.data.req === "task1ReturnFromB") deferred.resolve(event.data)
}, { once: true });
return deferred.promise
})
}],
task2: ['codeService', 'task1', '$window', '$q', function(codeService, task1, $window, $q) {
return codeService.task2().then(function () { // task2 sends a request to Application B by postMessage
var deferred = $q.defer();
$window.addEventListener("message", function (event) {
if (event.data.req === "task2ReturnFromB") deferred.resolve(event.data)
}, { once: true });
return deferred.promise
})
}]
所以在这种特定情况下,应用程序 B 发送的postMessage 会触发该事件。在更一般的情况下,我想我们可能会在一个应用程序中通过例如dispatchEvent 触发一个事件?
【问题讨论】:
-
您需要定义一个事件处理程序 - 例如
function onGreenLight(),然后在设置灯光颜色的部分代码中执行它。这不是异步或同步的——这是事件驱动的。您无需等待它变绿 - 当它变绿时您就可以做一些事情。 -
onGreenLight可以通过doTask1()等函数结束触发。在 JavaScript 中触发事件的最佳方式是什么? -
将灯设置为红色或绿色的代码 - 您在此处执行事件处理程序。
-
@SoftTimur 最好不要混合和匹配异步模型。使用代表灯变绿的承诺,并在其上使用
then(或将其与其他一些承诺结合使用)。 -
你没有告诉我们你的灯是如何工作的(除了它不能做什么)。它提供了哪些 API?
标签: javascript asynchronous promise angular-promise