异步等待异常行为

时间:2019-03-31 19:07:12

标签: javascript async-await

我正在尝试了解JavaScript异步/等待功能。

所以我写了一段简短的代码来理解它,但这给了我异常的行为/结果。

var a = 10;

function load_data(data) {
  setTimeout(() => {
    a = data
  }, 2000);
}

function print() {
  console.log(a);
}

async function init() {
  await load_data(40);
  print();
}

init();

我希望记录的值是40,但是用async和await记录的值是10。

6 个答案:

答案 0 :(得分:2)

异步await depends on Promises,但您并未在代码中的任何地方做出承诺。因此,等待load_data不会等待。

尝试使用Promise,并在发生超时后解决:

function load_data(data){
    return new Promise(resolve => setTimeout(() => {
        a=data
        resolve()
    }, 2000))
}

此外,我们将假设这只是为了学习异步/等待...否则,您应该以这种方式使用全局变量再次考虑所有常见建议。一旦您的代码变大,这就是一团糟

var a = 10

function load_data(data){
    return new Promise(resolve => setTimeout(() => {
        a=data
        resolve()
    }, 2000))
}

function print(){
    console.log(a)
}

async function init(){
    await load_data(40);
    print();
}

init();

答案 1 :(得分:2)

异步/等待是用于处理承诺的语法,而不仅仅是任何异步行为。为了使其与kernel_size, stride, padding)一起使用,该函数需要返回一个解析为40的promise对象。

这应该符合您的期望:

load_data

在学习异步等待之前,了解诺言是必不可少的,因为这只是关于诺言的语法。

答案 2 :(得分:2)

您应该在Promise中返回一个load_data()。实际上,您什么也不返回,因此代码不等待任何值被解析。您应该执行以下操作:

function load_data(data){
    return new Promise( resolve => {
       setTimeout(() => {
           a=data;
           resolve(true);
       }, 2000)
    }
}

答案 3 :(得分:1)

您应该创造承诺。此外,最好不要使用全局变量,而应让promise解析为所需的值:

function load_data(data){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(data); //<-- pass data to resolve
        }, 2000)
    });
}

async function init(){
    let data = await load_data(40); // <--- get the promised value
    console.log(data);
}

init();

答案 4 :(得分:0)

请在执行打印功能之前为您的值设置承诺

var a = 10;
function load_data(data) {
  return new Promise(resolve => {
      a=data;
      resolve('resolved');
  });
}

async function init() {

  var result = await load_data(40);
  print();
}

function print(){
    console.log(a)
}

init();

答案 5 :(得分:0)

请参阅:manual1 manual2

这对我有用:

# Load mnist training data
(x_train, y_train), _ = tf.keras.datasets.mnist.load_data()
training_set = tfdata_generator(x_train, y_train,is_training=True)

model = # your keras model here              
model.fit(
    training_set.make_one_shot_iterator(),
    steps_per_epoch=len(x_train) // 128,
    epochs=5,
    verbose = 1)