我无法弄清楚如何执行子函数并且有一个延迟函数等待在返回之前调用它。
我拍了一个样本并对其进行了修改。它显示了我想做的事情。
基本上在以下示例中,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>
答案 0 :(得分:1)
如果您正在等待sub,则必须将代码移动到子功能。你也必须填写承诺,我在你的代码中没有看到
function sub() {
var deferred = new Deferred();
setTimeout(function () {
y = "some";
deferred.resolve(true);
}, 750)
return deferred.promise;
}
同样在调用函数中你必须等待响应然后.. 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;
}