2017-02-19 46 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

*“没有我的修改函数返回承诺。”*这是不可能的。只要一个函数返回一个promise,调用它的函数也必须返回一个promise(或接受一个回调函数)。 –

+0

如何避免将所有纯函数写入承诺,我是否需要将所有的承诺都包含在承诺中,因为有一个异步函数。 – user2386092

+1

不,*调用者*可以执行'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