我知道我们可以使用.then
来确保异步调用的顺序:
return doTask1()
.then(function () {
return doTask2()
})
但有时候灯光很方便并且能够说:等待并且在灯光设置为绿色之前不执行任务2 ; 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触发事件?
答案 0 :(得分:0)
使用Promise将是最好的方法。 Promise是执行函数的对象,当该函数完成时,执行THEN函数。 但只有当函数返回结果时才会显示。
<tr>
<td>
<%=task.description%>
</td>
</tr>
答案 1 :(得分:0)
你没有告诉我们关于你的灯的API的任何信息,所以我只能猜测它是什么样的。假设它是一个事件驱动模型,您可以将其转换为承诺,并执行此操作:
function waitForGreenLight() {
return new Promise(function (resolve) {
$window.addEventListener("message", function (event) {
if (event.data.req === "task2ReturnFromB") {
resolve(event.data)
}
}, { once: true });
});
}
return doTask1()
.then(waitForGreenLight)
.then(doTask2);
如果你的灯没有提供事件,你可以有waitForGreenLight
定期轮询它直到它是绿色的。使用waitForGreenLight
的代码将保持不变。
function waitForGreenLight() {
return new Promise(function (resolve) {
var handle = setInterval(function () {
if (myLight.color === 'green') {
resolve();
clearInterval(handle);
}
}, 100);
});
}