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