2017-09-19 14 views
0

私はasync関数からステータスを取得したいが、それは常に未定義のステータスを返し、戻りステータスを含む関数に行く。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

条件チェックではなく、割り当てがあります。** if **ブロック – Damask

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](https://stackoverflow.com/questions/14220321/how- do-i-return-as-asynchronous呼び出し) –

答えて

1

標準的な方法は、Promiseを使用することです。 Attilaが記述したのと似ていますが、ライブラリを使用する必要はありません。

これはすべての最新のブラウザとnodejs/iojsで動作します。もしInternet Explorerを気にしないのなら、それは私が思うように最良の選択です。 Internet Explorerが必要な場合は、shimを使用できます。 Googleの「shim promise」にはいくつかのオプションがありますが、試してみませんでした。

-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); 
}); 
関連する問題