javascript - DOJO Promise All 子函数

标签 javascript dojo promise

我无法弄清楚如何执行子函数并让延迟函数在返回之前等待调用它。

我已经取样并修改了它。它显示了我想做什么。

基本上在下面的例子中 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;
        }

fiddle :http://jsfiddle.net/theinnkeeper/pJXJ9/

关于javascript - DOJO Promise All 子函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312908/

相关文章:

javascript - jQuery 添加输入字段并处理选择更改事件

javascript - 从多个延迟中获取结果并传递给函数

javascript - 是否可以在没有目标的方法上使用 dojo 方面?

dojo.query 不适用于包含波浪号 (~) 字符的属性选择器

javascript - Angular 2等待 promise 和可观察的解决

javascript - 如何让 Protractor 延迟 Promise 发挥作用?

javascript - 使用 promise 顺序执行功能

javascript - Material Design Lite 的复选框不适用于列表

javascript - 如何在 Angularjs 服务中使用作为 ES6 模块导入的外部 JavaScript 库?

javascript - 如何在 dijit 菜单上放置垂直滚动条