2016-12-15 4 views
1

Я пытаюсь создать с использованием обещаний JavaScript.Возможно ли это в обещаниях JavaScript?

х = {а: 5}

Пример:

new Promise(resolve => { 
    setTimeout(() => { 
     resolve(5); 
    }, 2000) 
}).then(v => { 
    x = { 
     a: v 
    }; 
    console.log(x); 
}) 

НО, я хочу узнать, как можно достичь того же, используя этот код:

x = { 
    a: new Promise(resolve => { 
     setTimeout(() => { 
      resolve(5); 
     }, 2000) 
    }) 
}; 

Просим руководствоваться. Я буду в долгу.

+2

Вы, вероятно, ищете [асинхронном] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)/ждет комбинацию. В вашем коде свойство 'a' является объектом обещания, а не разрешенной стоимостью обещания. – undefined

+2

'Я хочу узнать, как я могу добиться того же, используя этот код ', вообще невозможно - обещание - это обещание, оно никогда не меняется ни на что другое ... например' 5' ... это '5', это может 'превращаемся в "Hello world" ' –

ответ

4

Нет, это невозможно с обещаниями.

Похоже, вы ошибаетесь в том, что такое обещание или как оно работает. Обещание - это объект, который в конечном итоге будет содержать какое-то будущее значение, и он содержит метод .then(fn), с помощью которого вы можете зарегистрировать обратный вызов для вызова, когда доступно будущее значение, или если возникает ошибка при попытке получить это значение.

Но обещание не «станет» в будущем, оно всегда остается объектом обещания. Таким образом, вы не можете делать то, что вы показываете, как вы его показываете. Обещания не превращаются в их разрешенные ценности. Они сохраняют разрешенное значение внутри, чтобы они могли уведомить зарегистрированных обработчиков .then(), когда значение становится доступным (или если есть ошибки, пытающиеся получить значение).

Поскольку непонятно, что проблема реального мира в том, что вы на самом деле пытаетесь решить, я не уверен, какой код рекомендуется, но ясно, что вы не можете делать то, что вы пытаетесь сделать ,

Я хочу, чтобы узнать, как я могу добиться того же с помощью этого кода

Это просто невозможно с этим кодом. Это не то, как обещают работу.


Вы могли бы создать функцию, которая в конечном итоге установить x.a свойство 5, когда обещание было принято решение, хотя я не знаю, почему вы не просто код, который находится прямо в .then() обработчика Обещание (как я сказал , Я не вижу, какую проблему в мире вы пытаетесь решить здесь).

// set obj[prop] to the resolved value of the promise p 
function setProp(p, obj, prop) { 
    return p.then(function(val) { 
     obj[prop] = val; 
    }); 
} 

let x = {}; 
let p = new Promise(resolve => { 
    setTimeout(() => { 
     resolve(5); 
    }, 2000); 
}); 

setProp(p, x, "a").then(function() { 
    console.log(x); 
}); 
Смежные вопросы