如何使复合promises异步执行

时间:2016-05-30 21:54:20

标签: javascript typescript promise

我有两个承诺,用于抽象出我在使用Typescript编写的移动应用程序中的所有蓝牙扫描逻辑,用于Nativescript。我从我导入HomeComponent的函数返回了承诺。我希望我的HomeComponent中的then仅在我的扫描例程中的所有逻辑都完成后运行,此时它会在扫描开始后立即运行。

ble.scan.ts:

import * as dialogs from "ui/dialogs";
import * as bluetooth from "nativescript-bluetooth";

var devices: Array<bluetooth.Peripheral>;
var _peripheral: bluetooth.Peripheral;

export function scan() {
    return bluetooth.hasCoarseLocationPermission().then(
        (granted) => {
            if (!granted) {
                bluetooth.requestCoarseLocationPermission();
            } else {
                bluetooth.scan({
                }).then(() => {
                    console.log("scanning complete");
                    if (this.devices == undefined) {
                        return null;
                    }
                    console.log("2"); // ************** SECOND ****************
                }, (err) => {
                    console.log("error while scanning: " + err);
                });
            }
        });
}

Home.Component.ts:

console.log("1"); // ************** FIRST ****************
this._ble.scan().then(
     // Log the fulfillment value
    function (val) {
        console.log("3"); // ************** THIRD ****************
         _this.addClicked = toggleAdd(_this.page, _this, _this.addClicked); //toggle button
        _this.Connect(val);                
    })

如何按顺序运行?

更新

在回复重复的评论时,链接的答案似乎是多个,然后在彼此之后执行。我的问题是关于不同层面的问题,例如:我希望HomeComponent then在ble.scan then之后执行。在链接的答案中,它在同一级别上是多个?

所以我希望我的代码中的3个console.log按顺序打印出来,即1,2,3,不管任何调用等等多长时间。我目前正在获得1,3,2 - 即,一旦创建了te promise,就会调用第三个日志,而不是在它已经解决时。

更新

从链接问题中得到确切的例子,我有:

test() {
    addElement("first")
        .then(
            function (val){
                addElement("second");
                console.log("second.");
            })
            .then(
            function (val){
                addElement("third");
                console.log("third.");
            });
}


export function addElement(elementText){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            console.log(elementText);
            resolve();
        }, Math.random() * 2000);
    });
}

我希望打印出这些函数first, second., second, third., third。但是,我得到了:

  

JS:首先   JS:第二名。   JS:第三名。   JS:第三名   JS:第二次

如何在被叫承诺后执行then&#39;然后完成了?

0 个答案:

没有答案