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

*「約束を返すために私の修正機能を持たない」*これは不可能です。 1つの関数が約束を返すとすぐに、それを呼び出す関数は約束を返す必要があります(またはコールバックを受け入れる)。 –

+0

純粋な関数をすべて約束することを避けるには、1つの非同期関数のためにすべてを約束する必要がありますか? – 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

関連する問題