我无法弄清楚如何执行子函数并让延迟函数在返回之前等待调用它。
我已经取样并修改了它。它显示了我想做什么。
基本上在下面的例子中 bingRequest 调用 sub 只是设置一个值。我希望 BingRequest 等到该子调用完成。在我的真实世界案例中,该值会影响 bingRequest 函数将返回的内容。我目前刚刚将子代码卡在 bingRequest 中,但它产生了一个非常大的函数,如果我可以将子代码拆分出来,它会更清晰。如果我必须将所有这些结合起来,我会但希望能够拆分出一些代码。
感谢您的关注。
<!DOCTYPE html>
<html >
<head>
<link rel="stylesheet" href="../../_static/js/dojo/../dijit/themes/claro/claro.css">
<script>dojoConfig = { async: true, parseOnLoad: false }</script>
<script src='//ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.js'></script>
<script>
require(["dojo/promise/all", "dojo/Deferred", "dojo/dom", "dojo/on", "dojo/json", "dojo/domReady!"],
function (all, Deferred, dom, on, JSON) {
var y = "none"
function googleRequest() {
var deferred = new Deferred();
setTimeout(function () {
deferred.resolve("foo");
}, 500);
return deferred.promise;
}
function bingRequest() {
var deferred = new Deferred();
setTimeout(function () {
deferred.resolve("bar");
sub();
}, 750);
return deferred.promise;
}
function sub() {
setTimeout(function () {
y = "some";
}, 750)
}
function baiduRequest() {
var deferred = new Deferred();
setTimeout(function () {
deferred.resolve("baz");
}, 1000);
return deferred.promise;
}
on(dom.byId("startButton"), "click", function () {
dom.byId("output").innerHTML = "Running...";
all([googleRequest(), bingRequest(), baiduRequest()]).then(function (results) {
dom.byId("output").innerHTML = JSON.stringify(results)+y;
});
});
});
</script>
</head>
<body class="claro">
<h1>Output:</h1>
<pre id="output"></pre>
<button type="button" id="startButton">Start</button>
</body>
</html>
最佳答案
如果您正在等待 sub,那么您必须将代码移至 sub 函数。你也必须履行 promise ,我在你的代码中没有看到这一点
function sub() {
var deferred = new Deferred();
setTimeout(function () {
y = "some";
deferred.resolve(true);
}, 750)
return deferred.promise;
}
同样在调用函数中,您必须使用 then.. 等待响应。 CORRECTION 将 deffered.resolve("bar") 移到了里面。
function bingRequest() {
var deferred = new Deferred();
setTimeout(function () {
sub().then(function(ret){
//do what you want with y and return this promise
//ret will be the value you set in the resolve in this case true
deferred.resolve("bar");
});
}, 750);
return deferred.promise;
}
关于javascript - DOJO Promise All 子函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312908/