如何从setInterval函数返回值?

时间:2017-09-19 11:30:39

标签: javascript asynchronous settimeout setinterval

我想从异步函数中获取状态,但它总是返回未定义的状态,而不是返回包含返回状态的函数;

main.js

 let status = addData(firstname, lastname, age, sex);
 console.log(status);

data.js

static async addData(firstname, lastname, age, sex) {
  try {

    let txdata = await data.dataentry(firstname, lastname, age, sex);

    let count = 0;
    let intervalId = setInterval(async() => {
      let status = await data.entryStatus(txdata);
      logger.info("status %o", status);


      if (status = true) {
        clearInterval(intervalId);
        return status;
      } else {
        count++;
        if (count > 4) {
          clearInterval(intervalId);
          throw createError();
        }
      }
    }, 500);

  } catch (err) {
    throw createError();
  }
}

2 个答案:

答案 0 :(得分:1)

从异步函数返回结果的标准方法是使用Promise。 它与Attila描述的完全相似,但您不需要库来使用它。

它适用于所有现代浏览器和nodejs / iojs,所以如果你不关心Internet Explorer,它是我认为最好的选择。 如果您需要Internet Explorer,可以使用垫片。 " shim promise"在谷歌提供了几个选项,但我没有尝试任何选择。

答案 1 :(得分:-1)

不可能这样,因为你的函数将在异步任务完成之前返回。

您可以使用Observables。所以你的data.js可能是:

function adddata(firstname,lastname,age,sex) {
    return Observable.create(observer => {
        try {
            let txdata = await data.dataentry(firstname,lastname,age,sex);
            let count = 0;
            let intervalId = setInterval(async () => {
                let status = await data.entryStatus(txdata);
                logger.info("status %o", status);

                if (status = true) {
                    clearInterval(intervalId);
                    // here you can send whatever you want through the observable
                    observer.next(status);
                    observer.onCompleted();
                } else {
                    count++;
                    if (count > 4) {
                        clearInterval(intervalId);
                        observer.error(createError());
                    }
                }
            }, 500);
        } catch (err) {
             observer.error(createError());
        }
    }
});

在你的main.js中你可以订阅:

adddata(firstname,lastname,age,sex).subscribe(result => {
    // you will get your result here
    console.log(result);
});