gpt4 book ai didi

javascript - 跟踪变量实例

转载 作者:行者123 更新时间:2023-11-29 15:33:28 25 4
gpt4 key购买 nike

下面我创建了一个名为 promiseRipple 的函数,它接受一个对象字面量,其值是函数。每个函数都可以包含同步代码或异步 promise

var _ = require('lodash')
var Promise = require('bluebird')

function promiseRipple (start, props) {
props = (props) ? props : start
start = (props) ? start : {}
props = _.mapValues(props, function (prop, key) {
prop.key = key
return prop
})
return Promise.reduce(_.values(props), function (result, action) {
if (typeof action !== 'function') throw new Error('property values must be functions')
return Promise.resolve(action(start)).then(function (value) {
start[action.key] = value
return value
})
}, null)
.then(function () {
return start
})
}

基本用法

promiseRipple({zero: 'zero'}, {
'alpha': function (data) {
return Promise.resolve(data.zero + ' alpha') // async -> 'zero alpha'
},
'beta': function (data) {
return data.zero + ' beta' // -> 'zero beta'
},
'gamma': function (data) {
return Promise.resolve(data.zero + ' gamma') // async -> 'zero gamma'
},
'delta': function (data) {
return Promise.resolve(data.zero + data.alpha + ' delta') // async -> 'zerozero alpha delta'
},
}).then(function (results){
// results -> {
// zero: 'zero',
// alpha: 'zero alpha',
// beta: 'zero beta',
// gamma: 'zero gamma',
// delta: 'zerozero alpha delta'
// }
})

我想添加一些功能,以便在函数中返回 data 时,新的数据属性将扩展到现有的。

promiseRipple({zero: 'zero'}, {
'alpha': function (data) {
return Promise.resolve(data.zero + ' alpha') // async -> 'zero alpha'
},
'beta': function (data) {
data.foo = data.zero + ' foo' // -> 'zero foo'
data.bar = data.zero + ' bar' // -> 'zero bar'
return data
},
'gamma': function (data) {
return Promise.resolve(data.zero + ' gamma') // async -> 'zero gamma'
},
'delta': function (data) {
return Promise.resolve(data.zero + data.alpha + ' delta') // async -> 'zerozero alpha delta'
},
}).then(function (results){
// results -> {
// zero: 'zero',
// alpha: 'zero alpha',
// foo: 'zero foo',
// bar: 'zero bar',
// gamma: 'zero gamma',
// delta: 'zerozero alpha delta'
// }
})

我尝试创建一个自定义对象字面量,它允许我检测 prop 函数的返回值是 data 还是某个新变量。但是,这不起作用。

var _ = require('lodash')
var Promise = require('bluebird')

function Start (data) {
if (data) return data
return {}
}
Start.prototype = Object.prototype

function promiseRipple (start, props) {
props = (props) ? props : start
start = (props) ? new Start(start) : new Start()
props = _.mapValues(props, function (prop, key) {
prop.key = key
return prop
})
return Promise.reduce(_.values(props), function (result, action) {
if (typeof action !== 'function') throw new Error('property values must be functions')
return Promise.resolve(action(start)).then(function (value) {
console.log(value instanceof Start)
if (value instanceof Start) {
_.extend(start, value)
return start
} else {
start[action.key] = value
return value
}
})
}, null)
.then(function () {
return start
})
}

module.exports = promiseRipple

有什么好方法可以检测返回的对象是否与我们开始使用的对象相同,同时又不会弄乱对象的值?

最佳答案

因为这与您提出问题的动机有关,您应该注意到在 JavaScript 中,非原始变量是“通过引用”传递给函数的。这意味着在函数内对对象的更改将在函数外引用对象时反射(reflect)在对象中,并且是否传回无关紧要。

要回答您的问题,您只需检查对象和返回值之间的相等性即可。

注意事项:

function f(obj) {
obj.b = 'b test';
return obj;
}

var obj_1 = {};
obj_1.a = 'a test';
// This is really just a reference to the same object as obj_1
var obj_2 = f(obj_1);

console.log(obj_1); // {a: "a test", b: "b test"}
console.log(obj_2); // {a: "a test", b: "b test"}
// Here is how you can test for equality with the original object passed in
console.log(obj_1 === obj_2); // true

关于javascript - 跟踪变量实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32149895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com