如何在将函数赋值给 javascript/mocha 中的变量之前等待函数 return 一个值

How to wait for a function to return a value before assigning it to a variable in javascript/mocha

请看我的摩卡测试:

it.only('verify Lot in CFR List',function(done)){
this.timeout(20000);
var data = ui.cfrVerifyLot(); //calling cfrVerifyLot() method from another file
data.then(function(result) {
  console.log(result); // 'getting undefined' 'expecting success or failed'
  if(result=='success'){
    done();
  }
});
}

似乎 ui.cfrVerifyLot() 方法在完成自身之前分配返回值。 怎么让它在完全完成之前等待分配结果。

这是我的 cfrVerifyLot() 函数:

cfrVerifyLot:function(){

    var result = '';
    const rest = require('./restAPI');
    const puppeteer = require('puppeteer');
    const assert = require('chai').assert;
    const cfg = require('../config-env.json');
    const objR = require('../obj-repo/obj-c.json');
    puppeteer.launch({
    //headless:false
}).then(async browser => {

    /*
    making some UI navigations
    */
    try{
    const innerText = await page.evaluate(() => document.querySelectorAll('some element name')[1].innerText);
    var str = innerText.substring(0,8);
    await page.waitFor(2*1000);
    if(str===input_lot_number){
      result = 'success'
      }          
    }
    catch(err){
      result = 'failed'  
    }
    finally{
      await browser.close();
      return result
    }
    });
},

您可以使用 asyncawait 运算符。

 it.only('verify Lot in CFR List',async function(done)){
    this.timeout(20000);
    var result = await ui.cfrVerifyLot();
      console.log(result); // 'getting undefined' 'expecting success or failed'
      if(result=='success'){
        done();
      }
    });
    }

编辑 你的 cfrVerifyLot 函数 returns 没有价值。相反,result 是 return 从 pupperteer 编辑而来的。将 puperteer's then 链更改为使用 await,这样您 return 直接来自函数的 result 值。

cfrVerifyLot:async function(){

    var result = '';
    const rest = require('./restAPI');
    const puppeteer = require('puppeteer');
    const assert = require('chai').assert;
    const cfg = require('../config-env.json');
    const objR = require('../obj-repo/obj-c.json');
    let browser = await puppeteer.launch({//headless:false})
     /*
    making some UI navigations
    */
    try{
    const innerText = await page.evaluate(() => document.querySelectorAll('some element name')[1].innerText);
    var str = innerText.substring(0,8);
    await page.waitFor(2*1000);
    if(str===input_lot_number){
      result = 'success'
      }          
    }
    catch(err){
      result = 'failed'  
    }
    finally{
      await browser.close();
      return result
    }  
},