Вы пытаетесь обмануть обещания здесь!
Когда вы запускаете
var l = this.simpleStorageInstance.getContents(searchAddress, i, { from: searchAddress }).then((contents) => {
console.log('Retrieved contents');
return contents;
});
movieItems.push({id: i, poster_src: p, title: k, overview: l});
console.log('Pushed!')
движок javascript говорит: «Я вставлю это Обещание в l
напрямую и продолжу до movieItems.push
». Если вы запустите это, вы увидите журналы как
- Выдвинутый!
- Полученное содержимое
Нам еще многое предстоит узнать об обещаниях, поэтому я не могу объяснить все в этом посте. Быстрое решение на данный момент, при условии, что у вас есть среда или инструмент сборки, который его поддерживает, использует async/await
. Таким образом, вы можете заставить javascript «просто ждать», пока ваши обещания не будут выполнены.
сначала вы меняете
}).then((accountLength) => {
до }).then(async (accountLength) => {
который сообщает javascript, что вы собираетесь использовать await
и работать с Promises внутри функции. Тогда вы можете вместо .then
использовать await
следующим образом:
// Here I use `await` instead of `.then` to make the promise return "normally"
var hashVal = await this.simpleStorageInstance.getBook(searchAddress, i, { from: searchAddress });
// I do the transformations you did inside `.then(() => { ... })` "just" after the function call
var ipfsPrefix = "https://ipfs.io/ipfs/";
var ipfsURL = ipfsPrefix + hashVal;
var p = ipfsURL;
// Again, using `await` instead of `.then`
var k = await this.simpleStorageInstance.getTitle(searchAddress, i, { from: searchAddress })
var l = await this.simpleStorageInstance.getContents(searchAddress, i, { from: searchAddress });
Это заставит вашу функцию на самом деле возвращать массив значений вместо массива с обещаниями внутри.
Надеюсь это поможет! :)