2017-02-19 9 views
1
Object.prototype.modify = function(modifications,prop){ 
    modifications.forEach(modifier => { 
    this[prop] = modifier(this[prop]) 
    }) 
} 

function removeLastName(str){ 
    return str.split(' ')[0] 
} 

function upperCase(str){ 
    return str.toUpperCase() 
} 

function translate(str){ 
    return new Promise((resolve,reject) => { 
     setTimeout(_ => resolve(str+"translated"),1000) 
    }) 
} 

function prepareUser(user){ 
    user.modify([removeLastName,upperCase],'name') 
    // user.modify([removeLastName,upperCase,trans],'name') 
    return user 
} 

var user = { 
    name: "simon madsen" 
} 

console.log(prepareUser(user)); 

Здравствуйте, как я могу заставить свою функцию изменения использовать обычные функции и функции, которые возвращают обещание. Не имея всех моих функций, возвращающих обещания, и без моей функции изменения, чтобы вернуть обещание.Итерация над нормальными функциями и обещаниями

+3

* «без моей функции изменения, чтобы вернуть обещание». * Это невозможно. Как только одна функция возвращает обещание, функция, которая ее вызывает, должна также вернуть обещание (или принять обратный вызов). –

+0

Как вы избегаете писать все свои чистые функции для обещаний, мне нужно все обернуть обещаниями из-за одной асинхронной функции. – user2386092

+1

Нет, * caller * может выполнять 'Promise.resolve (f())'. Если 'f' вернет обещание, оно просто вернет это обещание. Если 'f' возвращает любое другое значение, будет возвращено обещание, которое разрешает это значение. –

ответ

0
Object.prototype.modify = function(modifications,prop){ 

    var modificationsPromises = modifications.map(modifier => { 
    return Promise.resolve(modifier(this[prop])) 
    .then(modifiedProp => { 
     this[prop] = modifiedProp 
    }) 
    }) 
    return Promise.all(modificationsPromises).then(_ => Promise.resolve(this)) 

} 

Вот мои решения, спасибо за ответ.

1

Вы могли бы попытаться преобразовать все синхронные функции обещаниям и использовать Promise.all см https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

return Promise.all(modifications.map(item => { 
    if (item instanceof Promise){ 
    return item 
    } else { 
    return new Promise(function(resolve, reject) { 
     try { 
     resolve(item(prop)) 
     } catch (err) { 
     reject(err) 
     } 
    }) 
    } 
})) 

// Then get the value after everything resolves 
user.modify([removeLastName,upperCase,translate],'name') 
    .then(function(results) { 
    user.name = results.pop() 
    console.log(user) 
    }) 
    .catch(function(err) { 
    console.log('Oops', err) 
    }) 
+0

Спасибо за ваше предложение. – user2386092

 Смежные вопросы

  • Нет связанных вопросов^_^