Как использовать результат .then function для другой функции в js?

#javascript #promise #app.js

#javascript #обещание #app.js

Вопрос:

Пожалуйста, помогите Я хочу использовать результат функции 1 (Fn1) в функции 2 (Fn2).

 App={
st: null,//st is number value

Fn1: function() {
    App.contracts.contractName.deployed().then(function(instance){
       return instance.getST();
    }).then(function(result){      
        App.st = resu<    
    });
},
Fn2: function() {
       alert(App.st)//
}    
}
 

Ответ №1:

Вам нужно позвонить Fn1 раньше Fn2 , чтобы получить доступ к его значению, так что давайте перейдем Fn1 к обещанию:

 App = {
    st: null,//st is number value

    Fn1: function() {
        return new Promise((resolve, reject) => {
            App.contracts.contractName.deployed().then(function(instance){
                return instance.getST();
            }).then(function(result){      
                App.st = resu<
                resolve();
            }).catch(function(err){
                reject(err);
            })
        })
    },
    Fn2: function() {
        alert(App.st)
    }    
}
 

или лучше с помощью async / await:

 App = {
    st: null,//st is number value

    Fn1: async function() {
        try {
            const instance = await App.contracts.contractName.deployed();
            const result = await instance.getST();
            App.st = resu<
        } catch(err) {
            throw err;
        }
    },
    Fn2: function() {
        alert(App.st)
    }    
}
 

Теперь вы можете подождать до Fn1 exec перед вызовом Fn2 :

 App.Fn1().then(function() {
  App.Fn2()
})
 

или с помощью async / await:

 await App.Fn1()
App.Fn2()
 

Комментарии:

1.Предупреждение: Это анти-шаблон вложенного обещания. App.contracts.contractName.deployed() уже возвращает обещание — нет смысла создавать еще одно.

2. @Quentin вот почему я предлагаю OP использовать async / await , где это возможно, вместо старомодного связывания / вложения обещаний

3. @Xeelley спасибо, оба метода работают.