我在弄清楚如何执行子功能以及在返回之前有一个延迟的函数等待调用时遇到了麻烦。
我已经取样并对其进行了修改。它显示了我想做什么。
基本上在以下示例中,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>
最佳答案
如果您正在等待子函数,则必须将代码移至子函数。你也必须履行诺言,我看不到你的代码
function sub() {
var deferred = new Deferred();
setTimeout(function () {
y = "some";
deferred.resolve(true);
}, 750)
return deferred.promise;
}
同样在调用函数中,您还必须等待使用then的响应。
更正然后将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;
}
小提琴:http://jsfiddle.net/theinnkeeper/pJXJ9/